package com.io.netty.codec;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

//ChannelInboundHandlerAdapter这个handler与SimpleChannelInboundHandler<>不同的是
//后面这个带的有数据穿过来的泛型前面那个没有
public class NettyClientHandler extends ChannelInboundHandlerAdapter {

    //Channel处于活动状态（已经连接到它的远程节点）。它现在可以接收和发送数据了
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        //创建该类的实例化对象，赋值，并且传过去
        //设置的是在那个proto文件中设置的属性的值，就是给id和name设置值，生成java文件时就提供了set和get方法
        StudentPOJO.Student builder = StudentPOJO.Student.newBuilder().setId(4).setName("千晨").build();
        ctx.writeAndFlush(builder);
    }

    //当通道有读取事件时，会触发（该通道有读取时间，就表示通道中有其他地方传过来数据）
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf buf = (ByteBuf) msg;
        System.out.println("服务器回复的消息:" + buf.toString(CharsetUtil.UTF_8));
        System.out.println("服务器的地址： "+ ctx.channel().remoteAddress());
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}
